import gradio as gr
import os
import time

from langchain_zhipu import ChatZhipuAI
from langchain_core.prompts import ChatPromptTemplate

from langchain_core.output_parsers import StrOutputParser


# Chatbot demo with multimodal input (text, markdown, LaTeX, code blocks, image, audio, & video). Plus shows support for streaming text.


def print_like_dislike(x: gr.LikeData):
    print(x.index, x.value, x.liked)


def add_message(history, message):
    for x in message["files"]:
        # return None
        history.append(((x,), None))
    if message["text"] != '':
        history.append((message["text"], None))
    return history, gr.MultimodalTextbox(value=None, interactive=False)


output_parser = StrOutputParser()


def bot(history, message):
    response = "**That's cool!**"
    print(response)
    print(message)
    history[-1][1] = response
    for character in response:
        history[-1][1] += character
        time.sleep(0.05)
        yield history


with gr.Blocks() as demo:
    chatbot = gr.Chatbot(
        [],
        elem_id="chatbot",
        bubble_full_width=False
    )

    chat_input = gr.MultimodalTextbox(interactive=True, file_types=["pdf", "txt", "docx", "doc"],
                                      placeholder="Enter message or upload file...", show_label=False)

    chat_msg = chat_input.submit(add_message, [chatbot, chat_input], [chatbot, chat_input])
    bot_msg = chat_msg.then(bot, chatbot, chatbot, api_name="bot_response")
    bot_msg.then(lambda: gr.MultimodalTextbox(interactive=True), None, [chat_input])

    chatbot.like(print_like_dislike, None, None)

demo.queue()

user = {
    "admin": "admin1",
    "root": "root2",
    "geely": "geely3"
}


def same_auth(username, password):
    password2 = user.get(username)
    if password2 is None:
        return False
    return password == password2


if __name__ == "__main__":
    # demo.launch(auth=("admin", "pass1234"))
    demo.launch(auth=same_auth)
